package com.wjw.java.oop.polymorphic_;

/**
 * 动态绑定机制：
 * 1.当调用对象方法的时候,该方法会和该对象的"内存地址/运行类型"绑定
 * 2.当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
 */
public class DynamicBinding {

    public static void main(String[] args) {
        //多态向上转型：父类的引用指向子类对象
        A a = new B();
        //访问成员方法,编译类型看=左边,运行类型看=右边
        //编译类型为A,A有sum()方法,编译通过
        //运行类型为B,B中没有sum()方法,就往父类A找,找到了
        System.out.println(a.sum());
        //访问成员方法,编译类型看=左边,运行类型看=右边
        //编译类型为A,A有sum1()方法,编译通过
        //运行类型为B,B中没有sum1()方法,就往父类A找,找到了
        System.out.println(a.sum1());
    }
}
class A{//父类
    public int i = 10;

    public int getI(){
        return i;
    }

    public int sum(){
        //动态绑定机制：
        //1.当调用对象方法的时候,该方法会和该对象的"内存地址/运行类型"绑定
        //运行类型为B,那么就是调用的B类中的getI() = 20
        return getI() + 10;//20 +10 = 30
    }

    public int sum1(){
        //2.当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
        return i + 10;//10 + 10 = 20
    }
}
class B extends A{//子类
    public int i = 20;

    public int getI(){
        return i;
    }

//    public int sum(){
//        return i + 20;
//    }
//
//    public int sum1(){
//        return i + 10;
//    }
}